/******************************************************************
 *
 *	CyberUPnP for Java
 *
 *	Copyright (C) Satoshi Konno 2002
 *
 *	File: ControlResponse.java
 *
 *	Revision;
 *
 *	01/29/03
 *		- first revision.
 *	
 ******************************************************************/

package org.cybergarage.upnp.control;

import org.cybergarage.http.HTTPStatus;
import org.cybergarage.soap.SOAP;
import org.cybergarage.soap.SOAPResponse;
import org.cybergarage.upnp.UPnP;
import org.cybergarage.upnp.UPnPStatus;
import org.cybergarage.xml.Node;

public class ControlResponse extends SOAPResponse
{
    public static final String FAULT_CODE   = "Client";
    public static final String FAULT_STRING = "UPnPError";

    // //////////////////////////////////////////////
    // Constructor
    // //////////////////////////////////////////////

    public ControlResponse()
    {
        setServer(UPnP.getServerName());
    }

    public ControlResponse(SOAPResponse soapRes)
    {
        super(soapRes);
    }

    // //////////////////////////////////////////////
    // FaultResponse
    // //////////////////////////////////////////////

    public void setFaultResponse(int errCode, String errDescr)
    {
        setStatusCode(HTTPStatus.INTERNAL_SERVER_ERROR);

        Node bodyNode = getBodyNode();
        Node faultNode = createFaultResponseNode(errCode, errDescr);
        bodyNode.addNode(faultNode);

        Node envNode = getEnvelopeNode();
        setContent(envNode);
    }

    public void setFaultResponse(int errCode)
    {
        setFaultResponse(errCode, UPnPStatus.code2String(errCode));
    }

    // //////////////////////////////////////////////
    // createFaultResponseNode
    // //////////////////////////////////////////////

    private Node createFaultResponseNode(int errCode, String errDescr)
    {
        // <s:Fault>
        Node faultNode = new Node(SOAP.XMLNS + SOAP.DELIM + SOAP.FAULT);

        // <faultcode>s:Client</faultcode>
        Node faultCodeNode = new Node(SOAP.FAULT_CODE);
        faultCodeNode.setValue(SOAP.XMLNS + SOAP.DELIM + FAULT_CODE);
        faultNode.addNode(faultCodeNode);

        // <faultstring>UPnPError</faultstring>
        Node faultStringNode = new Node(SOAP.FAULT_STRING);
        faultStringNode.setValue(FAULT_STRING);
        faultNode.addNode(faultStringNode);

        // <detail>
        Node detailNode = new Node(SOAP.DETAIL);
        faultNode.addNode(detailNode);

        // <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
        Node upnpErrorNode = new Node(FAULT_STRING);
        upnpErrorNode.setAttribute("xmlns", Control.XMLNS);
        detailNode.addNode(upnpErrorNode);

        // <errorCode>error code</errorCode>
        Node errorCodeNode = new Node(SOAP.ERROR_CODE);
        errorCodeNode.setValue(errCode);
        upnpErrorNode.addNode(errorCodeNode);

        // <errorDescription>error string</errorDescription>
        Node errorDesctiprionNode = new Node(SOAP.ERROR_DESCRIPTION);
        errorDesctiprionNode.setValue(errDescr);
        upnpErrorNode.addNode(errorDesctiprionNode);

        return faultNode;
    }

    private Node createFaultResponseNode(int errCode)
    {
        return createFaultResponseNode(errCode, UPnPStatus.code2String(errCode));
    }

    // //////////////////////////////////////////////
    // UPnP Error
    // //////////////////////////////////////////////

    private UPnPStatus upnpErr = new UPnPStatus();

    private Node getUPnPErrorNode()
    {
        Node detailNode = getFaultDetailNode();
        if (detailNode == null)
            return null;
        return detailNode.getNodeEndsWith(SOAP.UPNP_ERROR);
    }

    private Node getUPnPErrorCodeNode()
    {
        Node errorNode = getUPnPErrorNode();
        if (errorNode == null)
            return null;
        return errorNode.getNodeEndsWith(SOAP.ERROR_CODE);
    }

    private Node getUPnPErrorDescriptionNode()
    {
        Node errorNode = getUPnPErrorNode();
        if (errorNode == null)
            return null;
        return errorNode.getNodeEndsWith(SOAP.ERROR_DESCRIPTION);
    }

    public int getUPnPErrorCode()
    {
        Node errorCodeNode = getUPnPErrorCodeNode();
        if (errorCodeNode == null)
            return -1;
        String errorCodeStr = errorCodeNode.getValue();
        try
        {
            return Integer.parseInt(errorCodeStr);
        }
        catch (Exception e)
        {
            return -1;
        }
    }

    public String getUPnPErrorDescription()
    {
        Node errorDescNode = getUPnPErrorDescriptionNode();
        if (errorDescNode == null)
            return "";
        return errorDescNode.getValue();
    }

    public UPnPStatus getUPnPError()
    {
        int code = 0;
        String desc = "";
        code = getUPnPErrorCode();
        desc = getUPnPErrorDescription();
        upnpErr.setCode(code);
        upnpErr.setDescription(desc);
        return upnpErr;
    }

}
